﻿#region License
// Copyright 2009 Buu Nguyen (http://www.buunguyen.net/blog)
// 
// Licensed under the Apache License, Version 2.0 (the "License"); 
// you may not use this file except in compliance with the License. 
// You may obtain a copy of the License at 
// 
// http://www.apache.org/licenses/LICENSE-2.0 
// 
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an "AS IS" BASIS, 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
// See the License for the specific language governing permissions and 
// limitations under the License.
// 
// The latest version of this file can be found at http://dotcommon.codeplex.com
#endregion

using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Web;

namespace DotCommon.Web
{
    /// <summary>
    /// Helper class to make a POST request to a specific URL and return string response
    /// </summary>
    public class Request
    {
        private readonly string url;
        private readonly IList<KeyValuePair<string, string>> data;

        public Request(string url, IList<KeyValuePair<string, string>> data)
        {
            if (url == null)
                throw new ArgumentNullException("url");
            if (data == null)
                data = new List<KeyValuePair<string, string>>();
            this.url = url;
            this.data = data;
        }

        /// <summary>
        /// Sends the POST request and returns the response from the server.
        /// </summary>
        /// <returns>The response from the server.</returns>
        public string Send()
        {
            var dataString = BuildPostData();
            using (var webClient = new WebClient())
            {
                webClient.Headers.Add("content-type", "application/x-www-form-urlencoded");
                return webClient.UploadString(url, dataString);
            }
        }

        private string BuildPostData()
        {
            var parameters = new StringBuilder();
            foreach (var item in data)
            {
                if (parameters.Length != 0) parameters.Append("&");
                parameters.Append(item.Key)
                          .Append("=")
                          .Append(HttpUtility.UrlEncode(item.Value));
            }
            return parameters.ToString();
        }       
    }
}
